package com.example.springmvcdemo;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/request")//一般会有类注解,防止方法注解的路径是一样的
@RestController
public class RequestController {
    //传递单个参数
    @RequestMapping("/param1")
    public String param1(String userName){
        System.out.println("接收到参数:"+userName);
        return "接收到参数:"+userName;
    }

    @RequestMapping("/param2")
    public String param2(Integer age){
        return "接收到参数:"+age;
        //类型不匹配会认为是客户端的问题 --> warn
    }


    //传递多个参数
    @Deprecated//表示一个接口被废弃掉
    @RequestMapping("/param3")
    public String param3(String userName,String passWord){
        System.out.println("userName:"+userName+"passWord:"+passWord);//控制台
        return "用户名:"+userName+" 密码:"+passWord;
    }

    @RequestMapping("/param4")
    public String param4(UserInfo userInfo){
        return "对象: "+userInfo;
    }


    @RequestMapping("/param5")
    public String param5(@RequestParam(value = "userName",required = false)String name, String passWord){
        System.out.println("userName:"+name+"passWord:"+passWord);//控制台
        return "用户名:"+name+" 密码:"+passWord;
        //RequestParam 绑定前端的值,() 里面写前端传递过来的对象名称 --> 如果有这个注解,就会只找注解里面设置的value
        //required = false 表示这个value不是必填项
    }

    //传递数组
    //会自动组装成一个数组
    @RequestMapping("/param6")
    public String param6(String[] arrParam){
        return "对象: "+ Arrays.toString(arrParam);
    }

    //列表(集合)
    //因为传递方式和数组是一样的,所以数据会以数组的形式传递过来
    //所以需要通过强转,才能让数据以列表的形式进行传递
    @RequestMapping("/param7")
    public String param7(@RequestParam("listParam") List<String> listParam){
        return "对象: "+ listParam;
    }


    //接收 JSON
    @RequestMapping("/param8")
    public String param8(@RequestBody UserInfo userInfo){
        //没有注解,就没有办法将 JSON 字符串(参数)转换为对象
        System.out.println(userInfo);
        return "接收JSON:"+userInfo;
    }


    //从 url 中获取参数
    //在没有 @PathVariable 的情况下,传递的参数名要和 类注解里面的{}内容一致
    //加上之后,可以让方法的参数名和类注解里面传递的名字不相同,但是此时要保证 @PathVariable 里面的名字和类注解的名字相同
    @RequestMapping("/param9/{articleId}")
    public String param9(@PathVariable("articleId") Integer article){
        return "接收参数:"+article;
    }

    //从 url 中获取多个参数
    //此时输入的 url 必须要跟后端进行匹配,不能减少任何一个部分
    @RequestMapping("/param10/{name}/{id}")
    public String param10(@PathVariable("name") String userName,@PathVariable("id") Integer article){
        return "接收参数:"+userName+" " +article;
    }


    //文件
    @RequestMapping("/param11")
    public String param11(MultipartFile file) throws IOException {
        System.out.println(file.getName());
        file.transferTo(new File("C:\\学习使我快乐\\测试\\"+file.getOriginalFilename()));//文件上传,新建一个文件到指定路径,并命名
        return "接收文件"+file.getOriginalFilename();
    }

}
